As an extension, support incomplete types in the unordered containers to match what we already do in the associative containers. git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@146376 91177308-0d34-0410-b5e6-96231b3b80d8 
diff --git a/include/unordered_map b/include/unordered_map index 3b1701e..15243f6 100644 --- a/include/unordered_map +++ b/include/unordered_map 
@@ -325,7 +325,7 @@    _LIBCPP_BEGIN_NAMESPACE_STD   -template <class _Tp, class _Hash, bool = is_empty<_Hash>::value +template <class _Key, class _Tp, class _Hash, bool = is_empty<_Hash>::value  #if __has_feature(is_final)  && !__is_final(_Hash)  #endif @@ -333,6 +333,8 @@  class __unordered_map_hasher  : private _Hash  { + typedef pair<typename remove_const<_Key>::type, _Tp> _Pp; + typedef pair<const _Key, _Tp> _Cp;  public:  _LIBCPP_INLINE_VISIBILITY  __unordered_map_hasher() @@ -345,17 +347,23 @@  _LIBCPP_INLINE_VISIBILITY  const _Hash& hash_function() const _NOEXCEPT {return *this;}  _LIBCPP_INLINE_VISIBILITY - size_t operator()(const _Tp& __x) const + size_t operator()(const _Pp& __x) const  {return static_cast<const _Hash&>(*this)(__x.first);}  _LIBCPP_INLINE_VISIBILITY - size_t operator()(const typename _Tp::first_type& __x) const + size_t operator()(const _Cp& __x) const + {return static_cast<const _Hash&>(*this)(__x.first);} + _LIBCPP_INLINE_VISIBILITY + size_t operator()(const _Key& __x) const  {return static_cast<const _Hash&>(*this)(__x);}  };   -template <class _Tp, class _Hash> -class __unordered_map_hasher<_Tp, _Hash, false> +template <class _Key, class _Tp, class _Hash> +class __unordered_map_hasher<_Key, _Tp, _Hash, false>  {  _Hash __hash_; + + typedef pair<typename remove_const<_Key>::type, _Tp> _Pp; + typedef pair<const _Key, _Tp> _Cp;  public:  _LIBCPP_INLINE_VISIBILITY  __unordered_map_hasher() @@ -368,14 +376,17 @@  _LIBCPP_INLINE_VISIBILITY  const _Hash& hash_function() const _NOEXCEPT {return __hash_;}  _LIBCPP_INLINE_VISIBILITY - size_t operator()(const _Tp& __x) const + size_t operator()(const _Pp& __x) const  {return __hash_(__x.first);}  _LIBCPP_INLINE_VISIBILITY - size_t operator()(const typename _Tp::first_type& __x) const + size_t operator()(const _Cp& __x) const + {return __hash_(__x.first);} + _LIBCPP_INLINE_VISIBILITY + size_t operator()(const _Key& __x) const  {return __hash_(__x);}  };   -template <class _Tp, class _Pred, bool = is_empty<_Pred>::value +template <class _Key, class _Tp, class _Pred, bool = is_empty<_Pred>::value  #if __has_feature(is_final)  && !__is_final(_Pred)  #endif @@ -383,6 +394,8 @@  class __unordered_map_equal  : private _Pred  { + typedef pair<typename remove_const<_Key>::type, _Tp> _Pp; + typedef pair<const _Key, _Tp> _Cp;  public:  _LIBCPP_INLINE_VISIBILITY  __unordered_map_equal() @@ -395,24 +408,41 @@  _LIBCPP_INLINE_VISIBILITY  const _Pred& key_eq() const _NOEXCEPT {return *this;}  _LIBCPP_INLINE_VISIBILITY - bool operator()(const _Tp& __x, const _Tp& __y) const + bool operator()(const _Pp& __x, const _Pp& __y) const  {return static_cast<const _Pred&>(*this)(__x.first, __y.first);}  _LIBCPP_INLINE_VISIBILITY - bool operator()(const typename _Tp::first_type& __x, const _Tp& __y) const - {return static_cast<const _Pred&>(*this)(__x, __y.first);} + bool operator()(const _Pp& __x, const _Cp& __y) const + {return static_cast<const _Pred&>(*this)(__x.first, __y.first);}  _LIBCPP_INLINE_VISIBILITY - bool operator()(const _Tp& __x, const typename _Tp::first_type& __y) const + bool operator()(const _Pp& __x, const _Key& __y) const  {return static_cast<const _Pred&>(*this)(__x.first, __y);}  _LIBCPP_INLINE_VISIBILITY - bool operator()(const typename _Tp::first_type& __x, - const typename _Tp::first_type& __y) const + bool operator()(const _Cp& __x, const _Pp& __y) const + {return static_cast<const _Pred&>(*this)(__x.first, __y.first);} + _LIBCPP_INLINE_VISIBILITY + bool operator()(const _Cp& __x, const _Cp& __y) const + {return static_cast<const _Pred&>(*this)(__x.first, __y.first);} + _LIBCPP_INLINE_VISIBILITY + bool operator()(const _Cp& __x, const _Key& __y) const + {return static_cast<const _Pred&>(*this)(__x.first, __y);} + _LIBCPP_INLINE_VISIBILITY + bool operator()(const _Key& __x, const _Pp& __y) const + {return static_cast<const _Pred&>(*this)(__x, __y.first);} + _LIBCPP_INLINE_VISIBILITY + bool operator()(const _Key& __x, const _Cp& __y) const + {return static_cast<const _Pred&>(*this)(__x, __y.first);} + _LIBCPP_INLINE_VISIBILITY + bool operator()(const _Key& __x, const _Key& __y) const  {return static_cast<const _Pred&>(*this)(__x, __y);}  };   -template <class _Tp, class _Pred> -class __unordered_map_equal<_Tp, _Pred, false> +template <class _Key, class _Tp, class _Pred> +class __unordered_map_equal<_Key, _Tp, _Pred, false>  {  _Pred __pred_; + + typedef pair<typename remove_const<_Key>::type, _Tp> _Pp; + typedef pair<const _Key, _Tp> _Cp;  public:  _LIBCPP_INLINE_VISIBILITY  __unordered_map_equal() @@ -425,17 +455,31 @@  _LIBCPP_INLINE_VISIBILITY  const _Pred& key_eq() const _NOEXCEPT {return __pred_;}  _LIBCPP_INLINE_VISIBILITY - bool operator()(const _Tp& __x, const _Tp& __y) const + bool operator()(const _Pp& __x, const _Pp& __y) const  {return __pred_(__x.first, __y.first);}  _LIBCPP_INLINE_VISIBILITY - bool operator()(const typename _Tp::first_type& __x, const _Tp& __y) const - {return __pred_(__x, __y.first);} + bool operator()(const _Pp& __x, const _Cp& __y) const + {return __pred_(__x.first, __y.first);}  _LIBCPP_INLINE_VISIBILITY - bool operator()(const _Tp& __x, const typename _Tp::first_type& __y) const + bool operator()(const _Pp& __x, const _Key& __y) const  {return __pred_(__x.first, __y);}  _LIBCPP_INLINE_VISIBILITY - bool operator()(const typename _Tp::first_type& __x, - const typename _Tp::first_type& __y) const + bool operator()(const _Cp& __x, const _Pp& __y) const + {return __pred_(__x.first, __y.first);} + _LIBCPP_INLINE_VISIBILITY + bool operator()(const _Cp& __x, const _Cp& __y) const + {return __pred_(__x.first, __y.first);} + _LIBCPP_INLINE_VISIBILITY + bool operator()(const _Cp& __x, const _Key& __y) const + {return __pred_(__x.first, __y);} + _LIBCPP_INLINE_VISIBILITY + bool operator()(const _Key& __x, const _Pp& __y) const + {return __pred_(__x, __y.first);} + _LIBCPP_INLINE_VISIBILITY + bool operator()(const _Key& __x, const _Cp& __y) const + {return __pred_(__x, __y.first);} + _LIBCPP_INLINE_VISIBILITY + bool operator()(const _Key& __x, const _Key& __y) const  {return __pred_(__x, __y);}  };   @@ -632,8 +676,8 @@    private:  typedef pair<key_type, mapped_type> __value_type; - typedef __unordered_map_hasher<__value_type, hasher> __hasher; - typedef __unordered_map_equal<__value_type, key_equal> __key_equal; + typedef __unordered_map_hasher<key_type, mapped_type, hasher> __hasher; + typedef __unordered_map_equal<key_type, mapped_type, key_equal> __key_equal;  typedef typename allocator_traits<allocator_type>::template  #ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES  rebind_alloc<__value_type> @@ -1256,8 +1300,8 @@    private:  typedef pair<key_type, mapped_type> __value_type; - typedef __unordered_map_hasher<__value_type, hasher> __hasher; - typedef __unordered_map_equal<__value_type, key_equal> __key_equal; + typedef __unordered_map_hasher<key_type, mapped_type, hasher> __hasher; + typedef __unordered_map_equal<key_type, mapped_type, key_equal> __key_equal;  typedef typename allocator_traits<allocator_type>::template  #ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES  rebind_alloc<__value_type>